import axios, { type AxiosInstance, type AxiosRequestConfig } from "axios"
import { useUserStoreHook } from "@/store/modules/user"
import { ElMessage } from "element-plus"
import { get, merge } from "lodash-es"
import { getToken } from "./cache/cookies"
import {encryption_key,Encrypt,randomNum,Decrypt} from "@/utils/aes"


/** 退出登录并强制刷新页面（会重定向到登录页） */
function logout() {
  useUserStoreHook().logout()
  location.reload()
}

let isCheck: boolean = false // 是否验证

/** 创建请求实例 */
function createService() {
  // 创建一个 axios 实例命名为 service
  const service = axios.create()
  // 请求拦截
  service.interceptors.request.use(
    (config) => {
      // config.headers['token'] = getToken()
      console.log("--config", config)
      if (config.params && config.params.isCheck) {
        isCheck = true
      } else {
        isCheck = false
      }
      let noEncryption = ['/file/minioUpload','/rewardPenaltyRule/importData','/comeInRule/importData',"/designFile/importData",
      "/sysUser/importData","/userExam/importData","/putLetters/importData","/rewardPenaltyRule/importData" ] // 不用加密请求
      if( config.method.toLowerCase() == 'post' && noEncryption.indexOf(config.url) == -1 ){ // 请求类型是post
        
        let EncryptionData = {};
        let zhuanyiData = config.data//(typeof config.data ==='string'?JSON.parse(config.data):config.data) || {};
        let user_info = JSON.parse(localStorage.getItem("userinfo") || JSON.stringify({id:"0000",token:".xxxxxxxx"}))
        EncryptionData[ encryption_key(user_info.id,user_info.token) ] = Encrypt(JSON.stringify(zhuanyiData),randomNum)
        // // console.log( encryption_key() );
        // console.log('测试',Encrypt( '你好20240517' ,randomNum));
        // console.log( '解密:',Decrypt('u8OgW/ZWI0eHv7Vy+8w60w==',randomNum) )
        // console.log('keysss--',EncryptionData);
        config.data = JSON.stringify( EncryptionData )
      }
      config.headers = {
        ...config.headers,
        randomNum
      }
      
      return config
    },
    // 发送失败
    (error) => Promise.reject(error)
  )
  // 响应拦截（可根据具体业务作出相应的调整）
  service.interceptors.response.use(
    (response) => {
      // apiData 是 api 返回的数据
      const apiData = response.data
      
      // 二进制数据则直接返回
      const responseType = response.request?.responseType
      if (responseType === "blob" || responseType === "arraybuffer") return apiData
      // 这个 code 是和后端约定的业务 code
      const code = apiData.code
      
      // 如果开启不校验 直接走成功回调
      if (isCheck) {
        return apiData
      }
      // 如果没有 code, 代表这不是项目后端开发的 api
      if (code === undefined) {
        ElMessage.error("非本系统的接口")
        return Promise.reject(new Error("非本系统的接口"))
      }
      switch (code) {
        case 200:
          // 本系统采用 code === 0 来表示没有业务错误
          const api_randomNum = apiData.randomNum; // 后端的随机id
          if( api_randomNum ){

            let apidatafn = {
              ...apiData,
              data:apiData.data?JSON.parse(Decrypt(apiData.data,api_randomNum)):''
            }
            console.log('apidatafn---',apidatafn);
            
            return apidatafn
          }else{
            return apiData
          }
          
          
        case 401:
          // Token 过期时
          return logout()
        case 10002:
          // Token 过期时
          return logout()
        default:
          // 不是正确的 code
          ElMessage.error(apiData.msg || "Error")
          return Promise.reject(new Error("Error"))
      }
    },
    (error) => {
      console.log(error, "--error")

      // status 是 HTTP 状态码
      const status = get(error, "response.status")
      switch (status) {
        case 400:
          error.message = error?.response?.data?.msg || "请求错误"
          break
        case 401:
          // Token 过期时
          logout()
          break
        case 403:
          error.message = "拒绝访问"
          break
        case 404:
          error.message = "请求地址出错"
          break
        case 408:
          error.message = "请求超时"
          break
        case 500:
          error.message = "服务器内部错误"
          break
        case 501:
          error.message = "服务未实现"
          break
        case 502:
          error.message = "网关错误"
          break
        case 503:
          error.message = "服务不可用"
          break
        case 504:
          error.message = "网关超时"
          break
        case 505:
          error.message = "HTTP 版本不受支持"
          break
        default:
          break
      }
      ElMessage.error(error.message)
      return Promise.reject(error)
    }
  )
  return service
}

export const baseURL: string = "http://111.231.202.174:8799" // 请求根域名

/** 创建请求方法 */
function createRequest(service: AxiosInstance) {
  return function <T>(config: AxiosRequestConfig): Promise<T> {
    const token = getToken()
    const defaultConfig = {
      headers: {
        // 携带 Token
        Authorization: token ? `${token}` : undefined,
        // Authorization:token ? `Bearer ${token}` : undefined,
        "Content-Type": "application/json"
      },
      timeout: 1000 * 30, // 设置请求
      baseURL: baseURL, //import.meta.env.VITE_BASE_API,
      data: {}
    }
    // 将默认配置 defaultConfig 和传入的自定义配置 config 进行合并成为 mergeConfig
    const mergeConfig = merge(defaultConfig, config)
    return service(mergeConfig)
  }
}

/** 用于网络请求的实例 */
const service = createService()

/** 用于网络请求的方法 */
export const request = createRequest(service)
